<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2024/3/15
 * Time: 9:27
 */

namespace app\common\lib;


class TencentTts
{
    public $secretid;

    public $secretkey;

    public $region;

    public $ttsClient;

    protected static $instance;

    public function __construct()
    {

        $config = config('param.tencent_cloud');
        $this->secretid = $config['secretid'];
        $this->secretkey = $config['secretkey'];
        $this->region = $config['tts']['region'];

        $credential = new \TencentCloud\Common\Credential($this->secretid ,$this->secretkey);
        $this->ttsClient = new \TencentCloud\Tts\V20190823\TtsClient($credential, $this->region);
    }

    public static function getInstance()
    {
        //        if(is_object(self::$instance)){
//            return self::$instance;
//        }


        return new self();
    }

    /**
     * 基础语音合成
     * @param $text
     * @param array $option
     * @return array
     */
    public function textToVoice($text,$option=[])
    {
        $request = (new \TencentCloud\Tts\V20190823\Models\TextToVoiceRequest());
        $request->setText($text);
        $sessionId = round(microtime(true)*100000).mt_rand(100000,999999);
        $request->setSessionId($sessionId);

        //音量大小，范围：[0，10]，分别对应11个等级的音量，默认为0，代表正常音量。没有静音选项。
        //示例值：1
        !empty($option['volume']) && $request->setVolume($option['volume']);

        //语速，范围：[-2，6]，分别对应不同语速：-2代表0.6倍 -1代表0.8倍 0代表1.0倍（默认）1代表1.2倍//2代表1.5倍 6代表2.5倍
        //如果需要更细化的语速，可以保留小数点后 2 位，例如0.5/1.25/2.81等。
        !empty($option['speed']) && $request->setSpeed($option['speed']);

        //音色 ID，包括标准音色与精品音色，精品音色拟真度更高，价格不同于标准音色 音色列表。 https://cloud.tencent.com/document/product/1073/92668
        !empty($option['voiceId']) && $request->setVoiceType($option['voiceId']);

        //主语言类型：1-中文（默认）2-英文 3-日文
        !empty($option['language']) && $request->setPrimaryLanguage($option['language']);

        //音频采样率：24000：24k（部分音色支持，请参见音色列表）16000：16k（默认）8000：8k
        !empty($option['sampleRate']) && $request->setSampleRate($option['sampleRate']);

        //返回音频格式，可取值：wav（默认），mp3，pcm
        !empty($option['codec']) && $request->setCodec($option['codec']);
        empty($option['codec']) && $request->setCodec('mp3');
        $request->setEnableSubtitle(true);

        //支持多情感音色使用。取值: neutral(中性)、sad(悲伤)、happy(高兴)、angry(生气)、fear(恐惧)、news(新闻)、story(故事)、
        //radio(广播)、poetry(诗歌)、call(客服)、撒娇(sajiao)、厌恶(disgusted)、震惊(amaze)、平静(peaceful)、兴奋(exciting)、
        //傲娇(aojiao)、解说(jieshuo)
        !empty($option['emotionCategory']) && $request->setEmotionCategory($option['emotionCategory']);

        //控制合成音频情感程度，取值范围为[50,200],默认为100；只有EmotionCategory不为空时生效；
        !empty($option['emotionIntensity']) && $request->setEmotionIntensity($option['emotionIntensity']);

        $result = $this->ttsClient->TextToVoice($request);
        return $result->serialize();
    }

    /**
     * 长文本语音合成请求
     * @param $text
     * @param array $option
     * @return array
     */
    public function createTtsTask($text,$option=[])
    {
        $request = (new \TencentCloud\Tts\V20190823\Models\CreateTtsTaskRequest());
        $request->setText($text);

        //音量大小，范围：[0，10]，分别对应11个等级的音量，默认为0，代表正常音量。没有静音选项。
        //示例值：1
        !empty($option['volume']) && $request->setVolume($option['volume']);

        //语速，范围：[-2，2]，分别对应不同语速：-2代表0.6倍 -1代表0.8倍 0代表1.0倍（默认）1代表1.2倍//2代表1.5倍
        !empty($option['speed']) && $request->setSpeed($option['speed']);

        //音色 ID，包括标准音色与精品音色，精品音色拟真度更高，价格不同于标准音色 音色列表。 https://cloud.tencent.com/document/product/1073/92668
        !empty($option['voiceId']) && $request->setVoiceType($option['voiceId']);

        //主语言类型：1-中文（默认）2-英文 3-日文
        !empty($option['language']) && $request->setPrimaryLanguage($option['language']);

        //音频采样率：16000：16k（默认）8000：8k
        !empty($option['sampleRate']) && $request->setSampleRate($option['sampleRate']);

        //返回音频格式，可取值：mp3（默认），wav，pcm
        !empty($option['codec']) && $request->setCodec($option['codec']);

        $request->setEnableSubtitle(true);

        //支持多情感音色使用。取值: neutral(中性)、sad(悲伤)、happy(高兴)、angry(生气)、fear(恐惧)、news(新闻)、story(故事)、
        //radio(广播)、poetry(诗歌)、call(客服)、撒娇(sajiao)、厌恶(disgusted)、震惊(amaze)、平静(peaceful)、兴奋(exciting)、
        //傲娇(aojiao)、解说(jieshuo)
        !empty($option['emotionCategory']) && $request->setEmotionCategory($option['emotionCategory']);

        //控制合成音频情感程度，取值范围为[50,200],默认为100；只有EmotionCategory不为空时生效。
        !empty($option['emotionIntensity']) && $request->setEmotionIntensity($option['emotionIntensity']);

        $result = $this->ttsClient->CreateTtsTask($request);
        return $result->serialize();
    }

    /**
     * 长文本语音合成结果查询
     * @param $taskId
     * @return array
     */
    public function describeTtsTaskStatus($taskId)
    {
        $request = (new \TencentCloud\Tts\V20190823\Models\DescribeTtsTaskStatusRequest());
        $request->setTaskId($taskId);
        $result = $this->ttsClient->DescribeTtsTaskStatus($request);
        return $result->serialize();
    }


}